freeslot("MT_BLOOD", "MT_RFWSPARK")
freeslot("SPR_BLOD")
freeslot("S_BLOODFLY", "S_BLOODSPLAT", "S_RFWSPARKFLY")

mobjinfo[MT_BLOOD] = {
	spawnstate = S_BLOODFLY,
	spawnhealth = 1,
	seestate = S_NULL,
	seesound = sfx_null,
	reactiontime = 1,
	attacksound = sfx_null,
	painstate = S_NULL,
	painchance = 8192,
	painsound = sfx_null,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_NULL,
	xdeathstate = S_NULL,
	deathsound = sfx_null,
	speed = 10,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_NOCLIPTHING,
	raisestate = S_NULL
}

states[S_BLOODFLY] = {
	sprite = SPR_BLOD,
	frame = A,
	tics = -1,
	nextstate = S_BLOODFLY
}

states[S_BLOODSPLAT] = {
	sprite = SPR_BLOD,
	frame = B,
	tics = 1050,
	nextstate = S_NULL
}

mobjinfo[MT_RFWSPARK] = {
	spawnstate = S_RFWSPARKFLY,
	spawnhealth = 1,
	seestate = S_NULL,
	seesound = sfx_null,
	reactiontime = 1,
	attacksound = sfx_null,
	painstate = S_NULL,
	painchance = 8192,
	painsound = sfx_null,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_NULL,
	xdeathstate = S_NULL,
	deathsound = sfx_null,
	speed = 10,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_None,
	flags = MF_NOCLIPTHING|MF_BOUNCE|MF_GRENADEBOUNCE|MF_MISSILE,
	raisestate = S_NULL
}

states[S_RFWSPARKFLY] = {
	sprite = SPR_BLOD,
	frame = C,
	tics = 50,
	nextstate = S_NULL
}

RFW.BloodDefault = MT_BLOOD
RFW.BloodColorDefault = SKINCOLOR_RED

//mobjinfo[MT_PLAYER].bloodtype = MT_BLOOD
//mobjinfo[MT_PLAYER].bloodcolor = SKINCOLOR_RED

addHook("MobjSpawn", function(mo)
	P_SetObjectMomZ(mo, P_RandomRange(0, 6*FU), true)
	P_Thrust(mo, FixedAngle(P_RandomRange(0, (360*FU)-1)), P_RandomRange(0, 8*mo.scale))
end, MT_BLOOD)

addHook("MobjThinker", function(mo)
	if P_IsObjectOnGround(mo) and mo.state == S_BLOODFLY then
		mo.state = S_BLOODSPLAT
	end
end, MT_BLOOD)

local fuckintable = {SKINCOLOR_LIME, SKINCOLOR_OLIVE, SKINCOLOR_GOLD, SKINCOLOR_SANDY, SKINCOLOR_APPLE}

addHook("MobjSpawn", function(mo)
	mo.color = fuckintable[P_RandomRange(1, 5)]
	mo.colorized = true
	P_SetObjectMomZ(mo, P_RandomRange(0, 6*FU), true)
	local origin = mo.target
	P_Thrust(mo, FixedAngle(P_RandomRange(0, (360*FU)-1)), P_RandomRange(8*mo.scale, 16*mo.scale))
end, MT_RFWSPARK)

/*addHook("MobjThinker", function(mo)
	local trail = P_SpawnGhostMobj(mo)
	trail.state = S_RFWSPARKFLY
	trail.frame = 2
	trail.fuckingstupidbullshitisaspark = true
	local flip = P_MobjFlip(mo)
	local trail = P_SpawnGhostMobj(mo)
	P_SetOrigin(trail, mo.x-(mo.momx/4), mo.y-(mo.momy/4), mo.z-(mo.momz/4))
	trail.state = S_RFWSPARKFLY
	trail.frame = 2
	trail.fuckingstupidbullshitisaspark = true
	local trail = P_SpawnGhostMobj(mo)
	P_SetOrigin(trail, mo.x-(mo.momx/2), mo.y-(mo.momy/2), mo.z-(mo.momz/2))
	trail.state = S_RFWSPARKFLY
	trail.frame = 2
	trail.fuckingstupidbullshitisaspark = true
	local trail = P_SpawnGhostMobj(mo)
	P_SetOrigin(trail, mo.x-(mo.momx*3/4), mo.y-(mo.momy*3/4), mo.z-(mo.momz*3/4))
	trail.state = S_RFWSPARKFLY
	trail.frame = 2
	trail.fuckingstupidbullshitisaspark = true
	//if P_IsObjectOnGround(mo) then
	//	mo.state = S_NULL
	//end
end, MT_RFWSPARK)

addHook("MobjThinker", function(mo)
	if not (mo and mo.valid) then return end
	if not mo.fuckingstupidbullshitisaspark then return end
	mo.frame = 2
end, MT_GHOST)*/

function RFW.Bleed(mo)
	if not (mo and mo.valid) then return end //the object bleeding is invalid
	if mo.type == MT_PLAYER then return end //don't bleed if we're a player, use player bleeding function instead.
	if not (mo.flags & (MF_ENEMY|MF_BOSS)) then return end //we're not an object that should bleed
	local type = mo.type
	if (mobjinfo[type].bloodtype ~= nil and mobjinfo[type].bloodtype == MT_NULL) then return end //we specifically don't have a blood object
	local blood = P_SpawnMobjFromMobj(mo, 0, 0, mo.height/2, mobjinfo[type].bloodtype or RFW.BloodDefault)
	blood.color = mobjinfo[type].bloodcolor or RFW.BloodColorDefault
	blood.target = mo
	if P_MobjFlip(mo) == -1 then
		blood.momz = -$
		blood.eflags = $|MFE_VERTICALFLIP
	end
end

function RFW.BleedCoordinateForHitscan(x, y, z, _, mo)
	if not (mo and mo.valid) then return end //the object bleeding is invalid
	if mo.type == MT_PLAYER then return end //don't bleed if we're a player, use player bleeding function instead.
	if not (mo.flags & (MF_ENEMY|MF_BOSS)) then return end //we're not an object that should bleed
	local type = mo.type
	if (mobjinfo[type].bloodtype ~= nil and mobjinfo[type].bloodtype == MT_NULL) then return end //we specifically don't have a blood object
	local blood = P_SpawnMobjFromMobj(mo, x-mo.x, y-mo.y, z-mo.z, mobjinfo[type].bloodtype or RFW.BloodDefault)
	blood.color = mobjinfo[type].bloodcolor or RFW.BloodColorDefault
	blood.target = mo
	if P_MobjFlip(mo) == -1 then
		blood.momz = -$
		blood.eflags = $|MFE_VERTICALFLIP
	end
end

function RFW.SparkCoordinate(mo, x, y, z)
	if not (mo and mo.valid) then return end //the object bleeding is invalid
	if mo.type == MT_PLAYER then return end //don't bleed if we're a player, use player bleeding function instead.
	if not (mo.flags & (MF_ENEMY|MF_BOSS)) then return end //we're not an object that should bleed
	local type = mo.type
	if mobjinfo[type].sparktype == nil then return end
	local spark = P_SpawnMobjFromMobj(mo, x-mo.x, y-mo.y, z-mo.z, mobjinfo[type].sparktype)
	//spark.color = mobjinfo[type].bloodcolor or RFW.BloodColorDefault
	spark.target = mo
	if P_MobjFlip(mo) == -1 then
		spark.momz = -$
		spark.eflags = $|MFE_VERTICALFLIP
	end
end

mobjinfo[MT_BLUECRAWLA].sparktype = MT_RFWSPARK
mobjinfo[MT_REDCRAWLA].sparktype = MT_RFWSPARK
mobjinfo[MT_FACESTABBER].sparktype = MT_RFWSPARK
mobjinfo[MT_POPUPTURRET].sparktype = MT_RFWSPARK
mobjinfo[MT_ROBOHOOD].sparktype = MT_RFWSPARK
mobjinfo[MT_EGGMOBILE].sparktype = MT_RFWSPARK

//function RFW.FancyGib(mo)
//	
//end